/**
 * 
 */
package gui;

import helden.plugin.werteplugin.PluginZauberInfo;
import helden.plugin.werteplugin2.PluginHeld2;

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JCheckBoxMenuItem;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

import main.Controller;

/**
 * @author Christian
 * 
 */
public class GuiController implements ActionListener {

	/**
	 * 
	 */
	private JDialog mainDialog = null;

	/**
	 * 
	 */
	private JScrollPane scrollPane = null;

	/**
	 * 
	 */
	private JPanel mainPanel = null;

	/**
	 * 
	 */
	private JMenuBar menueLeiste = null;

	/**
	 * 
	 */
	private HauptFenster hauptFenster = null;

	/**
	 * 
	 */
	private Import importPanel = null;

	/**
	 * 
	 */
	private UpdateAlleZauberPanel updateAlleZauberPanel = null;

	/**
	 * 
	 */
	private AddZauberVariante addZauberVariante = null;

	/**
	 * 
	 */
	private EditZauberVariante editZauberVariante = null;

	/**
	 * 
	 */
	private HeldenUpdatePanel heldenUpdatePanel = null;

	/**
	 * 
	 */
	private HeldenUpdateZauber heldenUpdateZauber = null;

	/**
	 * 
	 */
	private Impressum impressum = null;

	/**
	 * @param parentFrame
	 *            HeldenJFrame
	 * @param headLine
	 *            HeadLine
	 */
	public GuiController(JFrame parentFrame, String headLine) {

		mainDialog = new JDialog(parentFrame, headLine, true);
		mainDialog.setJMenuBar(menuBauen());
		mainDialog.setSize(805, 747);
		mainDialog.setLocationRelativeTo(parentFrame);
		mainDialog.addWindowListener(new WindowAdapter() {

			@Override
			public void windowClosing(WindowEvent e) {

				Controller.getDatenController().allesInXmlSpeichern();
				mainDialog.dispose();
			}
		});
	}

	/**
	 * 
	 */
	private void refreshUI() {

		if (scrollPane != null) {
			mainDialog.remove(scrollPane);
		}
		scrollPane = new JScrollPane(mainPanel);
		scrollPane.setPreferredSize(new Dimension(900, 700));
		scrollPane.getVerticalScrollBar().setValue(0);
		mainDialog.add(scrollPane);
		mainDialog.validate();
		mainDialog.repaint();
		mainDialog.setVisible(true);
	}

	/**
	 * Zeigt das Hauptfenster mit allen Zaubern
	 */
	public void zeigeHauptfenster() {

		// if (hauptFenster == null) {
		hauptFenster = new HauptFenster();
		// }
		hauptFenster.repaint();
		mainPanel = hauptFenster;
		this.refreshUI();
	}

	/**
	 * Zeigt das Update alle Helden an
	 * 
	 * @param zauber
	 *            Zauber
	 */
	public void zeigeUpdateAlleHelden(PluginZauberInfo zauber) {

		updateAlleZauberPanel = new UpdateAlleZauberPanel(zauber);
		updateAlleZauberPanel.repaint();
		mainPanel = updateAlleZauberPanel;
		this.refreshUI();
	}

	/**
	 * Zeigt das Impressum an
	 */
	private void zeigeImpressum() {

		if (impressum == null) {
			impressum = new Impressum();
		}
		impressum.repaint();
		mainPanel = impressum;
		this.refreshUI();
	}

	/**
	 * 
	 * @return Giibt die Menübar zurück
	 */
	public JMenuBar menuBauen() {

		if (menueLeiste == null) {
			menueLeiste = new JMenuBar();
			JMenu menuFunktionen = new JMenu("Menü");
			JMenuItem importierenItem = new JMenuItem("Daten importieren");
			menuFunktionen.add(importierenItem);
			JMenuItem addZauberVarianteItem = new JMenuItem("Zaubervariante hinzufügen");
			menuFunktionen.add(addZauberVarianteItem);
			JMenuItem editZauberVarianteItem = new JMenuItem("Zaubervariante bearbeiten");
			menuFunktionen.add(editZauberVarianteItem);
			JMenuItem setZauberVarianteItem = new JMenuItem("Zaubervarianten auf Helden anwenden");
			menuFunktionen.add(setZauberVarianteItem);
			JMenu menuHilfe = new JMenu("Info");
			JMenuItem ueberItem = new JMenuItem("über Zauberinfo");
			JMenu menuEinstellung = new JMenu("Einstellungen");
			JCheckBoxMenuItem updateCheckBox = new JCheckBoxMenuItem("Updatecheck");
			updateCheckBox.setSelected(Controller.getDatenController().isUpdateCheck());
			menuEinstellung.add(updateCheckBox);
			menuFunktionen.add(menuEinstellung);
			updateCheckBox.addActionListener(this);
			ueberItem.addActionListener(this);
			importierenItem.addActionListener(this);
			addZauberVarianteItem.addActionListener(this);
			editZauberVarianteItem.addActionListener(this);
			setZauberVarianteItem.addActionListener(this);
			menueLeiste.add(menuFunktionen);
			menuHilfe.add(ueberItem);
			menueLeiste.add(menuHilfe);
		}
		return menueLeiste;
	}

	/**
	 * Aktualiesert den Titel des JDialogs
	 * 
	 * @param head
	 *            Kopfzeile
	 */
	public void setHeadLine(String head) {

		mainDialog.setTitle(head);
	}

	/**
	 * @param e
	 *            Event
	 */
	public void actionPerformed(ActionEvent e) {

		
		Object source = e.getSource();
		if (source instanceof JCheckBoxMenuItem) {
			JCheckBoxMenuItem item = (JCheckBoxMenuItem) source;
			
			if (item.getText().equals("Updatecheck")) {
				boolean bool = Controller.getDatenController().isUpdateCheck();
				System.out.println(bool);
				Controller.getDatenController().setUpdateCheck(!bool);
			}
		} else if (source instanceof JMenuItem) {
			JMenuItem item = (JMenuItem) source;
			if (item.getText().equals("über Zauberinfo")) {
				this.zeigeImpressum();
			} else if (item.getText().equals("Daten importieren")) {
				this.zeigeImportInfo();
			} else if (item.getText().equals("Zaubervariante hinzufügen")) {
				this.zeigeAddZauberVariante();
			} else if (item.getText().equals("Zaubervariante bearbeiten")) {
				this.zeigeEditZauberVariante();
			} else if (item.getText().equals("Zaubervarianten auf Helden anwenden")) {
				this.zeigeHeldenUpdatePanel();
			}
		}
	}

	/**
	 * 
	 */
	private void zeigeImportInfo() {

		if (importPanel == null) {
			importPanel = new Import();
		}
		importPanel.repaint();
		mainPanel = importPanel;
		this.refreshUI();
	}

	/**
	 * 
	 */
	private void zeigeAddZauberVariante() {

		addZauberVariante = new AddZauberVariante();
		addZauberVariante.repaint();
		mainPanel = addZauberVariante;
		this.refreshUI();
	}

	/**
	 * 
	 */
	private void zeigeEditZauberVariante() {

		editZauberVariante = new EditZauberVariante();
		editZauberVariante.repaint();
		mainPanel = editZauberVariante;
		this.refreshUI();
	}

	/**
	 * 
	 */
	public void zeigeHeldenUpdatePanel() {

		if (heldenUpdatePanel == null) {
			heldenUpdatePanel = new HeldenUpdatePanel();
		}
		heldenUpdatePanel.repaint();
		mainPanel = heldenUpdatePanel;
		this.refreshUI();
	}

	/**
	 * @param held
	 *            Der ausgewählte Held
	 * @param zauberIndex
	 *            Der Index des Zaubers der bearbeitet werden soll
	 */
	public void zeigeHeldenUpdateZauber(PluginHeld2 held, int zauberIndex) {

		heldenUpdateZauber = new HeldenUpdateZauber(held, zauberIndex);
		heldenUpdateZauber.repaint();
		mainPanel = heldenUpdateZauber;
		this.refreshUI();
	}
}
